package cn.lxh.system.service.impl;


import cn.lxh.system.domain.Employee;
import cn.lxh.system.domain.Role;
import cn.lxh.system.mapper.EmployeeMapper;
import cn.lxh.system.query.EmployeeQuery;
import cn.lxh.system.service.IEmployeeService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * EmployeeServiceImpl业务层类
 */
@Service // 该类交给spring管理
@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
// 将数据库设置成只读数据库, 此时若要进行写的操作, 会出现错误, 有事务就以事务方式执行, 没有事务就以非事务方式执行
public class EmployeeServiceImpl implements IEmployeeService {

    @Autowired
    private EmployeeMapper employeeMapper;

    /**
     * 添加员工
     *
     * @param employee
     */
    @Transactional // 开始事务
    @Override
    public void add(Employee employee) {
        employeeMapper.add(employee);
        // roleIds集合有数据才添加角色信息
        if (employee.getRoleIds().size() > 0) {
            // 添加员工角色信息
            employeeMapper.addEmployeeRoles(employee);
        }
    }

    /**
     * 根据id删除员工
     *
     * @param id
     */
    @Transactional // 开始事务
    @Override
    public void delete(Long id) {
        // 删除员工角色信息
        employeeMapper.deleteEmployeeRoles(id);
        employeeMapper.delete(id);
    }

    /**
     * 修改员工
     *
     * @param employee
     */
    @Transactional // 开始事务
    @Override
    public void update(Employee employee) {
        employeeMapper.update(employee);
        // 删除员工角色信息
        employeeMapper.deleteEmployeeRoles(employee.getId());
        // roleIds集合有数据才添加角色信息
        if (employee.getRoleIds().size() > 0) {
            // 添加员工角色信息
            employeeMapper.addEmployeeRoles(employee);
        }
    }

    /**
     * 根据id查询单个员工
     *
     * @param id
     * @return
     */
    @Override
    public Employee findOne(Long id) {
        return employeeMapper.findOne(id);
    }

    /**
     * 查询所有员工
     *
     * @return
     */
    @Override
    public List<Employee> findAll() {
        return employeeMapper.findAll();
    }

    /**
     * 根据id批量删除员工
     *
     * @param ids
     */
    @Transactional // 开始事务
    @Override
    public void patchDelete(Long[] ids) {
        for (Long id : ids) {
            // 删除员工角色信息
            employeeMapper.deleteEmployeeRoles(id);
        }
        employeeMapper.patchDelete(ids);
    }

    /**
     * 分页查询
     *
     * @param employeeQuery
     * @return
     */
    @Override
    public PageInfo<Employee> queryPage(EmployeeQuery employeeQuery) {
        // 开启分页, 它只对紧挨着下面的第一个查询所有的sql语句生效(1. 先查询总数量total 2. 根据application.yml中驱动名自动实现分页,如果是mysql就用limit
        // 3. 自动计算limit的第一个值: limit a, b
        PageHelper.startPage(employeeQuery.getCurrentPage(), employeeQuery.getPageSize());
        // 查询所有
        List<Employee> list = employeeMapper.queryPage(employeeQuery);
        // 遍历list集合
        for (Employee employee : list) {
            // 根据员工id查询员工的角色信息
            List<Role> roleList = employeeMapper.getRolesByEmployeeId(employee.getId());
            // 给员工的角色信息属性赋值
            employee.setRoles(roleList);
        }
        // 返回对象中有: list当前页分页数据和total总条数
        return new PageInfo<>(list);
    }
}
